package filter;

import beans.User;
import service.UserService;
import utils.CookieUtils;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * @author 王俊彪
 * @version 1.0
 */
/**
 * 过滤器拦截所有请求=>过滤器处理之后 => 放行
 * 自动登录核心过滤器的目的：恢复用户登录状态
 *  判断用户的登录状态（判断Session中是否有用户）
 *  1、有 =>用户依然是登录状态=>没必要过滤器还原会话状态=>直接放行
 *  2、没有
 *        a、查找name为autoLogin的cookie
 *          1、如果没找到name 为autoLogin的cookie=>说明用户登录时候没有勾选记住我=>放行
 *          2、如果找到name 为autoLogin的cookie
 *            从cookie中取出用户名和密码，根据用户名和密码查询数据库
 *            1、查到=>将用户信息存入session=>用户会话状态恢复=>放行
 *            2、没有查到=>cookie中用户信息有可能被篡改=>不恢复会话状态=>放行
 */
@WebFilter("/*")
public class AutoLoginFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        //判断用户登录状态（判断Session 中是否有用户）
        User existUser =(User) req.getSession().getAttribute("existUser");
        if(existUser !=null){
            //有=>用户依然是登录状态=>没必要利用过滤器还原会话状态=>直接放行
            chain.doFilter(req,resp);
        }else{//这里必做要写else，因为放行的话，不写else回来还是要执行下面的语句的
            //当前没有会话状态
            Cookie cookie = CookieUtils.getCookie("autoLogin", req.getCookies());
            if(cookie == null){
                //没有这个cookie说明上次登录时没有点记住我，或者是第一次登录，直接放行
                chain.doFilter(req,resp);
            }else{
                //从cookie中取出用户名和密码，根据用户名和密码查询数据库
                String[] values = cookie.getValue().split("#");
                UserService userService = new UserService();
                User user = userService.login(new User(values[0], values[1]));
                if(user == null){
                    //说明这个cookie 中的用户信息可能被篡改了=>不恢复会话状态=>放行
                    chain.doFilter(req,response);
                }else{
                    //查到=>将用户会话信息存入session=>用户会话状态恢复=>放行
                    req.getSession().setAttribute("existUser",user);
                    chain.doFilter(req,resp);
                }
            }
        }
    }
    @Override
    public void destroy() {

    }
}
